package helden.plugin.werteplugin3;

import helden.framework.geld.GeldBoerse;
import helden.framework.geld.WaehrungsCollection;
import helden.plugin.werteplugin.PluginAusruestung;
import helden.plugin.werteplugin.PluginHeld;
import helden.plugin.werteplugin.PluginSonderfertigkeit;
import helden.plugin.werteplugin.PluginTalent;
import helden.plugin.werteplugin.PluginVorteil;
import helden.plugin.werteplugin.PluginZauberInfo;
import helden.plugin.werteplugin2.PluginAusruestung2;
import helden.plugin.werteplugin2.PluginGegenstand;
import helden.plugin.werteplugin2.PluginTreeNode;

import java.util.ArrayList;
/**
 * Die Erweiterte Version des PluginHeldenWerteWerkzeug2
 * @author Maik Schiefer-Gehrke
 * @since 4.7.5
 */ 
public interface PluginHeldenWerteWerkzeug3 {

    /**
     * Gibt das Inventar des Helden als Strings zur�ck
     * @return ArrayList<Strings(Inventar-Gegenstand)>
     * @since 4.7.5
     */
    ArrayList<String> getHeldenInventarAlsString();
    
    /**
     * Gibt die Gegenst�nde aus dem Inventar des Helden zur�ck,
     * die zu dem Bezeichner geh�ren
     * @param bezeichnung Des Gegenstandes
     * @return PluginGegenstand
     * @since 4.7.5
     */
    PluginGegenstand[] getGegenstand(String bezeichnung);
    
    /**
     * Gibt den eindeutigen Identifikator des aktuellen Helden zur�ck
     * @return HeldenID
     * @since 4.7.5
     */
    String getHeldenID();
    
    /**
     * Liefert die Ausr�stung des Helden
     * @return PluginAusr�stung
     * @since 4.7.5
     */
    PluginAusruestung2 getAusruestung2();
    
    /**
     * Liefert die Geschwindigkeit des Helden
     * @return Geschwindigkeit
     * @since 4.7.5
     */
    int getGeschwindigkeit();
    
    /**
     * gibt die verf�hgbaren (also freien) AP zur�ck
     * @return Verfuegbare Abenteuerpunkte
     * @since 4.7.5
     */
    int getVerfuegbareAbenteuerpunkte();

    /**
     * gibt die eingestzten AP zur�ck
     * @return eingesetzten Abenteuerpunkte
     * @since 4.7.5
     */
    int getEingestzteAbenteuerpunkte();
    
    /**
     * Liefert Lern Komplexit�t des Zaubers
     * @param pz der Zauber
     * @return Komplexit�t a bis h (Kleiner als a -> a+, a2, a3, ..)
     * @since 4.7.5
     */
    String getLernKomplexitaet(PluginZauber3 pz);


    /**
     * Liefert Basis Komplexit�t des Zaubers
     * @param pz der Zauber
     * @return Komplexit�t a bis h
     * @since 4.7.5
     */
    String getBasisKomplexitaet(PluginZauber3 pz);

    /**
     * Liefert Komplexit�t einer Sprache oder Schrift
     * Sonst "";
     * @param pt die Sprache oder Schrift
     * @return Komplexit�t a bis h (Kleiner als a -> a+, a2, a3, ..)
     * @since 4.7.5
     */
    String getSprachKomplexitaet(PluginTalent pt);

    /**
     * Lifert den Kommentar zu einem Vorteil
     * @param pvt Vorteil
     * @return Kommentar
     * @since 4.7.5
     */
    String getKommentar(PluginVorteil pvt);

    /**
     * Lifert den Kommentar zu einer Sonderfetigkeit
     * @param psf Sonderfetigkeit
     * @return Kommentar
     * @since 4.7.5
     */
    String getKommentar(PluginSonderfertigkeit psf);

    /**
     * Liefert den Pfad zum Protrait
     * Sollte kein Pfad eingetragen sein wird Null zur�ck gegeben.
     * Es wird auch nicht sichergestellt, das das Bild vorhanden ist. 
     * @return Pfad zum Bild
     * @since 4.7.5
     */
    String getPfadZumPortrait();
    
    /**
     * gitb den Baum der Gruppen zur�ck
     * @return  Root des Gruppen Baumes
     * @since 4.7.5
     */
    PluginTreeNode getTreeRoot();

    /**
     * Liefert den Pfad zu dem Aktuell benutzen Pfad
     * @return Pfad zu der Aktiuell benutzen Gruppe 
     */
    String[] getGruppenPath();
    
    /**
     * Liefert die Zauberinformationen zu einem Zauber
     * @param pz Der Zauber
     * @return die ZauberInformationen
     */
    PluginZauberInfo getZauberInfo(PluginZauber3 pz);
    

    /**
     * Setzt den Held zu dem Werte abgefragt werden k�nnen.
     * @param held der Held
     * @since 4.7.1
     */
    void setAktivenHeld(PluginHeld held);

    /**
     * Gibt den Wert zu einer Eigenschaft 
     * @param eigenschaft Eigenschafts String
     * @return Wert
     * @since 4.7.1
     */
    int getEigenschaftswert(String eigenschaft);
    
    /**
     * Gibt die EigenschaftsBezeichner
     * @return EigenschaftsStrings[]
     * @since 4.7.1
     */
    String[] getEigenschaftsbezeichner();

    /**
     * Gibt die Geschweindigkeit der Rasse zur�ck
     * @return Geschwindigkleit der Rasse
     * @since 4.7.2
     */
    int getRassenGeschwindigkeit();
    
    /**
     * Gibt die Vorteil Strings
     * @return Stirngs der Vorteile
     * @since 4.7.1
     */
    String[] getVorteileAlsString();

    /**
     * Gibt ein PluginVorteil zu einem String
     * @param vorteil der String zu einem Vorteil
     * @return PluginVortei, dem man weiter Informationen entlocken kann.
     * @since 4.7.1
     */
    PluginVorteil getVorteil(String vorteil);
    
    /**
     * Gibt die Sonderfertigkeiten Strings
     * @return Stirngs der Sonderfertigkeiten
     * @since 4.7.1
     */
    String[] getSonderfertigkeitenAlsString();

    /**
     * Gibt ein PluginSonderfertigkeit zu einem String
     * @param sonderfertigkeit der String zu einem Sonderfertigkeit
     * @return PluginSonderfertigkeit, dem man weiter Informationen entlocken kann.
     * @since 4.7.1
     */
    PluginSonderfertigkeit getSonderfertigkeit(String sonderfertigkeit);

    /**
     * Gibt die Talente Strings
     * @return Strings der Talente
     * @since 4.7.1
     */
    String[] getTalenteAlsString();

    /**
     * Gibt die Zauber Strings
     * @return Strings der Zauber [i][0] und die Repr�sentation[i][1] 
     *  in der der Zauber beherrschft wird
     * @since 4.7.1
     */
    String[][] getZauberAlsString();

    /**
     * Gibt ein PluginTalente zu einem String
     * @param talent der String zu einem Talente
     * @return PluginTalente, dem man weiter Informationen entlocken kann.
     * @since 4.7.1
     */
    PluginTalent getTalent(String talent);

    /**
     * Gibt den Talentwert zur�ck
     * @param t PluginTalent
     * @return Talentwert
     */
    int getTalentwert(PluginTalent t);
    
    /**
     * Gibt ein PluginZauber zu einem String
     * @param zauber der String zu einem Zauber
     * @param repraesentation die Repr�sentation
     * @return PluginZauber, dem man weiter Informationen entlocken kann.
     * @since 4.7.1
     */
    PluginZauber3 getZauber(String zauber, String repraesentation);

    /**
     * Liefert den Attackewert f�r das angegebene Kampftalent
     * Hat das Talent keine Attacke, wird -1 zur�ckgegeben.
     * @param pluginTalent Ein Kampftalent
     * @return den Attackewert des PluginTalent
     * @since 4.7.1
     */
    int getAttacke(PluginTalent pluginTalent);    

    /**
     * Liefert den Paradewert f�r das angegebene Kampftalent.
     * Hat das Talent keine Parade, wird 0 zur�ckgegeben.
     * @param pluginTalent Ein Kampftalent
     * @return den Paradewert des PluginTalent
     * @since 4.7.1
     */
    int getParade(PluginTalent pluginTalent); 
    
    /**
     * Liefert die Ausr�stung des Helden
     * @return PluginAusr�stung
     * @since 4.7.1
     */
    PluginAusruestung getAusruestung();
    
    /**
     * Gibt die Geldboerse zur�ck
     * @return Geldboerse
     * @since 4.7.2
     */
    GeldBoerse getGeldBoerse();
    
    /**
     * Gibt die Liste der Waehrungen zur�ck
     * @return WaehrungsCollection
     * @since 4.7.2
     */
    WaehrungsCollection getWaehrungen();
    
    /**
     * Gibt das Gesammte Inventar als Strings zur�ck
     * @return ArrayList<Strings(Inventar-Gegenstand)>
     * @since 4.7.2
     */
    ArrayList<String> getInventarAlsString();
    
    /**
     * Liefert den Held der in der Heldenliste selectiert ist.
     * Wenn kein held selektiert ist, dann wird null zur�ck gegeben.
     * @return PluginHeld oder NULL
     * @since 4.7.2
     */
    PluginHeld getSelectesHeld();
}
